home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch9 / Sprites.frm < prev    next >
Text File  |  1999-05-28  |  10KB  |  337 lines

  1. VERSION 5.00
  2. Begin VB.Form SpriteForm 
  3.    Caption         =   "Sprites"
  4.    ClientHeight    =   5235
  5.    ClientLeft      =   1320
  6.    ClientTop       =   825
  7.    ClientWidth     =   6870
  8.    LinkTopic       =   "Form1"
  9.    PaletteMode     =   1  'UseZOrder
  10.    ScaleHeight     =   349
  11.    ScaleMode       =   3  'Pixel
  12.    ScaleWidth      =   458
  13.    Begin VB.TextBox txtFramesPerSecond 
  14.       Height          =   285
  15.       Left            =   1440
  16.       TabIndex        =   4
  17.       Text            =   "20"
  18.       Top             =   4920
  19.       Width           =   375
  20.    End
  21.    Begin VB.TextBox txtNumObjects 
  22.       Height          =   285
  23.       Left            =   1440
  24.       TabIndex        =   3
  25.       Text            =   "20"
  26.       Top             =   4560
  27.       Width           =   375
  28.    End
  29.    Begin VB.CommandButton cmdStart 
  30.       Caption         =   "Start"
  31.       Default         =   -1  'True
  32.       Height          =   495
  33.       Left            =   2160
  34.       TabIndex        =   1
  35.       Top             =   4620
  36.       Width           =   855
  37.    End
  38.    Begin VB.PictureBox picCanvas 
  39.       AutoRedraw      =   -1  'True
  40.       Height          =   4455
  41.       Left            =   0
  42.       ScaleHeight     =   293
  43.       ScaleMode       =   3  'Pixel
  44.       ScaleWidth      =   453
  45.       TabIndex        =   0
  46.       Top             =   0
  47.       Width           =   6855
  48.    End
  49.    Begin VB.Label Label1 
  50.       Caption         =   "Frames per second:"
  51.       Height          =   255
  52.       Index           =   0
  53.       Left            =   0
  54.       TabIndex        =   5
  55.       Top             =   4920
  56.       Width           =   1455
  57.    End
  58.    Begin VB.Label Label1 
  59.       Caption         =   "Number of objects:"
  60.       Height          =   255
  61.       Index           =   1
  62.       Left            =   0
  63.       TabIndex        =   2
  64.       Top             =   4560
  65.       Width           =   1455
  66.    End
  67. End
  68. Attribute VB_Name = "SpriteForm"
  69. Attribute VB_GlobalNameSpace = False
  70. Attribute VB_Creatable = False
  71. Attribute VB_PredeclaredId = True
  72. Attribute VB_Exposed = False
  73. Option Explicit
  74.  
  75. Private xmin As Integer
  76. Private ymin As Integer
  77. Private xmax As Integer
  78. Private ymax As Integer
  79.  
  80. Private NumSprites As Integer
  81. Private Sprites() As Sprite
  82.  
  83. Private Playing As Boolean
  84. Private NumPlayed As Long
  85.  
  86. Private BitmapWid As Long
  87. Private BitmapHgt As Long
  88. Private BitmapNumBytes As Long
  89. Private Bytes() As Byte
  90.  
  91. ' Bitmap Information
  92. Private Type BITMAP
  93.     bmType As Long
  94.     bmWidth As Long
  95.     bmHeight As Long
  96.     bmWidthBytes As Long
  97.     bmPlanes As Integer
  98.     bmBitsPixel As Integer
  99.     bmBits As Long
  100. End Type
  101. Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
  102. Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
  103. Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
  104.  
  105. ' Play the animation.
  106. Private Sub PlayImages(ByVal ms_per_frame As Long)
  107. Dim sprite_number As Integer
  108. Dim next_time As Long
  109.  
  110.     ' Get the current time.
  111.     next_time = GetTickCount()
  112.  
  113.     ' Start the animation.
  114.     Do While Playing
  115.         NumPlayed = NumPlayed + 1
  116.  
  117.         ' Restore the background.
  118.         SetBitmapBits picCanvas.Image, BitmapNumBytes, Bytes(1, 1)
  119.  
  120.         ' Draw and move the sprites.
  121.         For sprite_number = 1 To NumSprites
  122.             Sprites(sprite_number).DrawSprite picCanvas
  123.             Sprites(sprite_number).MoveSprite xmin, xmax, ymin, ymax
  124.         Next sprite_number
  125.  
  126.         ' Wait until it's time for the next frame.
  127.         next_time = next_time + ms_per_frame
  128.         WaitTill next_time
  129.     Loop
  130. End Sub
  131.  
  132. ' Draw some random rectangles on the bacground.
  133. Private Sub DrawBackground()
  134. Dim i As Integer
  135. Dim Wid As Single
  136. Dim Hgt As Single
  137.  
  138.     ' Start with a clean slate.
  139.     picCanvas.Line (0, 0)-(picCanvas.ScaleWidth, picCanvas.ScaleHeight), picCanvas.BackColor, BF
  140.  
  141.     ' Draw some rectangles.
  142.     For i = 1 To 10
  143.         Hgt = 10 + Rnd * xmax / 3
  144.         Wid = 10 + Rnd * ymax / 3
  145.         picCanvas.Line (Int(Rnd * xmax), Int(Rnd * ymax))-Step(Hgt, Wid), QBColor(Int(Rnd * 16)), BF
  146.     Next i
  147.  
  148.     ' Make the rectangles part of the permanent background.
  149.     picCanvas.Picture = picCanvas.Image
  150. End Sub
  151.  
  152. ' Generate some random data.
  153. Private Sub InitializeData()
  154. Dim obj As Object
  155. Dim i As Integer
  156.  
  157.     ' See how many objects there should be.
  158.     If Not IsNumeric(txtNumObjects.Text) Then Exit Sub
  159.     NumSprites = CInt(txtNumObjects.Text)
  160.     If NumSprites < 1 Then Exit Sub
  161.  
  162.     ' Create the sprites.
  163.     ReDim Sprites(1 To NumSprites)
  164.     For i = 1 To NumSprites
  165.         ' Pick a random sprite type.
  166.         Select Case Int(3 * Rnd)
  167.             Case 0
  168.                 Set Sprites(i) = NewRectangle()
  169.             Case 1
  170.                 Set Sprites(i) = NewTriangle()
  171.             Case 2
  172.                 Set Sprites(i) = NewBall()
  173.         End Select
  174.     Next i
  175. End Sub
  176.  
  177.  
  178.  
  179. ' Create and initialize a random BallSprite.
  180. Private Function NewBall() As BallSprite
  181. Dim new_sprite As BallSprite
  182. Dim new_color As Long
  183.  
  184.     ' Make the new sprite.
  185.     Set new_sprite = New BallSprite
  186.  
  187.     ' Pick a color other than 7 (gray).
  188.     new_color = Int(15 * Rnd)
  189.     If new_color >= 7 Then new_color = new_color + 1
  190.  
  191.     ' Initialize the sprite.
  192.     new_sprite.InitializeBall _
  193.         Int(15 * Rnd + 5), _
  194.         Int(xmax * Rnd), _
  195.         Int(ymax * Rnd), _
  196.         Int(11 * Rnd - 5), Int(11 * Rnd - 5), _
  197.         QBColor(new_color)
  198.  
  199.     Set NewBall = new_sprite
  200. End Function
  201.  
  202.  
  203. ' Create and initialize a random TriangleSprite.
  204. Private Function NewTriangle() As TriangleSprite
  205. Const PI = 3.14159265
  206. Const THIRD_CIRCLE = 2 * PI / 3
  207. Const PI_OVER_8 = PI / 8
  208. Const PI_OVER_16 = PI / 16
  209.  
  210. Dim new_sprite As TriangleSprite
  211. Dim new_color As Long
  212.  
  213.     ' Make the new sprite.
  214.     Set new_sprite = New TriangleSprite
  215.  
  216.     ' Pick a color other than 7 (gray).
  217.     new_color = Int(15 * Rnd)
  218.     If new_color >= 7 Then new_color = new_color + 1
  219.  
  220.     ' Initialize the sprite.
  221.     new_sprite.InitializeTriangle _
  222.         Int(xmax * Rnd), Int(ymax * Rnd), _
  223.         Int(11 * Rnd - 5), Int(11 * Rnd - 5), _
  224.         Int(15 * Rnd + 10), THIRD_CIRCLE * Rnd, _
  225.         Int(15 * Rnd + 10), THIRD_CIRCLE * (1 + Rnd), _
  226.         Int(15 * Rnd + 10), THIRD_CIRCLE * (2 + Rnd), _
  227.         0, PI_OVER_8 * Rnd - PI_OVER_16, _
  228.         QBColor(new_color)
  229.  
  230.     Set NewTriangle = new_sprite
  231. End Function
  232.  
  233. ' Create and initialize a random RectangleSprite.
  234. Private Function NewRectangle() As RectangleSprite
  235. Const PI = 3.14159265
  236. Const PI_OVER_2 = PI / 2
  237. Const PI_OVER_8 = PI / 8
  238. Const PI_OVER_16 = PI / 16
  239.  
  240. Dim new_sprite As RectangleSprite
  241. Dim new_color As Integer
  242.  
  243.     ' Make the new sprite.
  244.     Set new_sprite = New RectangleSprite
  245.  
  246.     ' Pick a color other than 7 (gray).
  247.     new_color = Int(15 * Rnd)
  248.     If new_color >= 7 Then new_color = new_color + 1
  249.  
  250.     ' Initialize the sprite.
  251.     new_sprite.InitializeRectangle _
  252.         Int(20 * Rnd + 10), _
  253.         Int(20 * Rnd + 10), _
  254.         Int(xmax * Rnd), Int(ymax * Rnd), _
  255.         Int(11 * Rnd - 5), Int(11 * Rnd - 5), _
  256.         PI_OVER_2 * Rnd, _
  257.         PI_OVER_8 * Rnd - PI_OVER_16, _
  258.         QBColor(new_color)
  259.  
  260.     Set NewRectangle = new_sprite
  261. End Function
  262.  
  263.  
  264.  
  265. ' Start the animation.
  266. Private Sub cmdStart_Click()
  267.     If Playing Then
  268.         Playing = False
  269.         cmdStart.Caption = "Stopped"
  270.         cmdStart.Enabled = False
  271.     Else
  272.         cmdStart.Caption = "Stop"
  273.         Playing = True
  274.         InitializeData
  275.         PlayData
  276.         Playing = False
  277.         cmdStart.Caption = "Start"
  278.         cmdStart.Enabled = True
  279.     End If
  280. End Sub
  281.  
  282. ' Play the animation.
  283. Private Sub PlayData()
  284. Dim ms_per_frame As Long
  285. Dim start_time As Single
  286. Dim stop_time As Single
  287. Dim bm As BITMAP
  288.  
  289.     ' Draw a random background.
  290.     DrawBackground
  291.  
  292.     ' Save the background bitmap data.
  293.     GetObject picCanvas.Image, Len(bm), bm
  294.     BitmapWid = bm.bmWidthBytes
  295.     BitmapHgt = bm.bmHeight
  296.     BitmapNumBytes = BitmapWid * BitmapHgt
  297.     ReDim Bytes(1 To bm.bmWidthBytes, 1 To bm.bmHeight)
  298.     GetBitmapBits picCanvas.Image, BitmapNumBytes, Bytes(1, 1)
  299.  
  300.     ' See how fast we should go.
  301.     If Not IsNumeric(txtFramesPerSecond.Text) Then _
  302.         txtFramesPerSecond.Text = "10"
  303.     ms_per_frame = 1000 \ CLng(txtFramesPerSecond.Text)
  304.  
  305.     ' Start the animation.
  306.     NumPlayed = 0
  307.     start_time = Timer
  308.     PlayImages ms_per_frame
  309.  
  310.     ' Display results.
  311.     stop_time = Timer
  312.     MsgBox "Displayed" & Str$(NumPlayed) & _
  313.         " frames in " & _
  314.         Format$(stop_time - start_time, "0.00") & _
  315.         " seconds (" & _
  316.         Format$(NumPlayed / (stop_time - start_time), "0.00") & _
  317.         " FPS)."
  318. End Sub
  319.  
  320. Private Sub Form_Load()
  321.     picCanvas.FillStyle = vbFSSolid
  322. End Sub
  323. ' Make the ball picCanvas nice and big.
  324. Private Sub Form_Resize()
  325. Const GAP = 3
  326.  
  327.     txtFramesPerSecond.Top = ScaleHeight - GAP - txtFramesPerSecond.Height
  328.     Label1(0).Top = txtFramesPerSecond.Top
  329.     txtNumObjects.Top = txtFramesPerSecond.Top - GAP - txtNumObjects.Height
  330.     Label1(1).Top = txtNumObjects.Top
  331.     cmdStart.Top = (txtNumObjects.Top + txtFramesPerSecond.Top + txtFramesPerSecond.Height - cmdStart.Height) / 2
  332.     picCanvas.Move 0, 0, ScaleWidth, txtNumObjects.Top - GAP
  333.  
  334.     xmax = picCanvas.ScaleWidth - 1
  335.     ymax = picCanvas.ScaleHeight - 1
  336. End Sub
  337.